home *** CD-ROM | disk | FTP | other *** search
- /* mem.c
- *
- * explore memory allocation
- *
- */
-
- #include "abc.h"
- #include "MemoryMgr.h"
- #include "Quickdraw.h"
- #include "EventMgr.h"
- #include "WindowMgr.h"
- #include "MenuMgr.h"
- #include "FontMgr.h"
-
- /* defines for menu ID's */
-
- #define Mdesk 100
- #define Mfile 101
- #define Medit 102
- #define Mmem 103
-
- /* Window items */
- /* File */
- #define iNew 1
- #define iClose 2
- #define iQuit 3
-
- /* Edit */
- #define iUndo 1
- #define iCut 3
- #define iCopy 4
- #define iPaste 5
-
- /* Memory */
- #define iZone 1
- #define iMzone 2
- #define iInfo 3
- #define iHand 4
- #define iPtr 5
- #define iFreeH 6
- #define iFreeP 7
-
- /* Global variables */
-
- MenuHandle menuDesk; /* menu handles */
- MenuHandle menuFile;
- MenuHandle menuEdit;
- MenuHandle menuMem;
-
- WindowPtr theWindow;
- WindowRecord windowRec;
- Rect dragbound;
- Rect limitRect;
-
- /*
- * structure needed to examine heap not typically
- * supplied by Mac development systems because normal
- * applications do not need to examine the heap.
- */
- struct memheads
- {
- long physsize;
- long relhand;
- };
-
- main()
- {
- initsys(); /* sys init */
- initapp(); /* appl init */
- eventloop();
- }
-
- /* system initialization
- */
- initsys()
- {
- InitGraf(&thePort);
- InitFonts();
- InitWindows();
- InitCursor();
- InitMenus();
- theWindow = Nil; /* no window */
- SetRect(&dragbound,0,0,512,250);
- SetRect(&limitRect,60,40,508,244);
- }
-
- /*
- * application initialization
- * Sets up menus.
- */
- initapp()
- {
- setupmenu();
- }
-
- /*
- * set up application's menus
- * Each menu is a separate group
- * of lines.
- */
- setupmenu()
- {
- menuDesk = NewMenu(Mdesk,CtoPstr("\24"));
- AddResMenu (menuDesk, 'DRVR');
- InsertMenu (menuDesk, 0);
-
- menuFile = NewMenu(Mfile, CtoPstr("File"));
- AppendMenu (menuFile,
- CtoPstr("New/N;Close;Quit/Q"));
- InsertMenu (menuFile, 0);
-
- menuEdit = NewMenu(Medit, CtoPstr("Edit"));
- AppendMenu (menuEdit,
- CtoPstr("(Undo/Z;(-;(Cut/X;(Copy/C;(Paste/V;(Clear"));
- InsertMenu (menuEdit, 0);
-
- menuMem = NewMenu(Mmem, CtoPstr("Memory"));
- AppendMenu (menuMem,
- CtoPstr("Show Zone;Max Zone;Zone Info;New Handle;New Pointer"));
- AppendMenu (menuMem,CtoPstr("Free Handle;Free Pointer"));
- InsertMenu (menuMem, 0);
-
- DrawMenuBar();
- }
-
- /* Event Loop
- * Loop forever until Quit
- */
- eventloop()
- {
- EventRecord theEvent;
- char c;
- short windowcode;
- WindowPtr ww;
-
- while(True)
- {
- if (theWindow) /* this code is here to */
- { /* prevent closing an */
- EnableItem(menuFile,2); /* already closed window */
- DisableItem(menuFile,1);
- }
- else
- {
- EnableItem(menuFile,1);
- DisableItem(menuFile,2);
- }
- if (GetNextEvent(everyEvent,&theEvent))
-
- switch(theEvent.what)
- { /* only check key and */
- case mouseDown:
- domousedown(&theEvent);
- break;
- default:
- break;
- }
-
- }
- }
-
- /* domousedown
- * handle mouse down events
- */
- domousedown(er)
- EventRecord *er;
- {
- short windowcode;
- WindowPtr whichWindow;
- short ingo;
- long size;
- long newsize;
- RgnPtr rp;
- Rect box;
- Rect *boxp;
-
- windowcode = FindWindow(er->where,
- &whichWindow);
- switch (windowcode)
- {
- case inDesk:
- if (theWindow notequal 0)
- {
- HiliteWindow(theWindow, False);
- DrawGrowIcon(theWindow);
- }
- break;
- case inMenuBar:
- domenu(MenuSelect(er->where));
- break;
- }
- }
-
- /* domenu
- * handles menu activity
- * simply a dispatcher for each
- * menu.
- */
- domenu(mc)
- long mc; /* menu result */
- {
- short menuId;
- short menuitem;
-
- menuId = HiWord(mc);
- menuitem = LoWord(mc);
-
- switch (menuId)
- {
- case Mdesk : break;
- /* not handling DA's */
- case Mfile : dofile(menuitem);
- break;
- case Mmem : domem(menuitem);
- break;
- }
- HiliteMenu(0);
- }
-
- domem(item)
- short item;
- {
- THz zone;
- static long size = 1024;
- static Handle hand = 0;
- static Ptr ptr = 0;
- struct memheads *memhead;
-
- switch (item)
- {
- case iZone :
- zone = GetZone();
- printw("\nzone %ld ",zone);
- showzone(zone);
- break;
- case iMzone :
- MaxApplZone();
- break;
- case iInfo :
- zone = GetZone();
- countzone(zone);
- break;
- case iHand :
- hand = NewHandle(size);
- printw("\nhandle %ld pointer %lx error %d ",hand,*hand,MemError());
- printw(" free mem %ld ",FreeMem());
- size = size * 2;
- break;
- case iPtr :
- ptr = NewPtr(size);
- printw("\npointer %ld error %d free mem %ld",ptr,MemError(),FreeMem());
- showhead(ptr-8);
- break;
- case iFreeH :
- if (hand equals 0)
- printw("\nNo current handle to free");
- else
- {
- DisposHandle(hand);
- hand = 0;
- }
- break;
- case iFreeP :
- if (ptr equals 0)
- printw("\nNo current pointer to free");
- else
- {
- DisposPtr(ptr);
- ptr = 0;
- }
- }
-
- }
-
- showhead(head)
- struct memheads *head;
- {
- uchar tagbyte;
-
- printw ("\naddress %ld ",(char*)head + 8);
- tagbyte = head->physsize >> 24;
- printw ("size correction %d ",tagbyte & 0xF);
- tagbyte >>= 6;
- switch (tagbyte)
- {
- case 0:
- printw(" free block ");
- break;
- case 1:
- printw(" non rel ");
- break;
- case 2:
- printw(" rel ");
- break;
- }
- printw(" physical size %ld ",head->physsize & 0x00FFFFFF);
- return (tagbyte);
- }
-
- showzone(zone)
- THz zone;
- {
- struct memheads *memhead;
- short tblocks = 0;
- short tfree = 0;
- short trel = 0;
- short tnonrel = 0;
-
- memhead = (struct memheads*)&zone->heapData;
- while (memhead < (struct memheads*)zone->bkLim)
- {
- switch (showhead(memhead))
- {
- case 0 : tfree++; break;
- case 1 : tnonrel++; break;
- case 2 : trel++; break;
- }
- tblocks++;
- memhead = (struct memheads*)((char*)memhead + (memhead->physsize & 0x00FFFFFF));
- }
- printw("\n blocks %d free %d relocatable %d non-relocatable %d ",
- tblocks, tfree, trel,tnonrel);
- }
-
- countzone(zone)
- THz zone;
- {
- struct memheads *memhead;
- short tblocks = 0;
- short tfree = 0;
- short trel = 0;
- short tnonrel = 0;
- uchar tagbyte;
-
- memhead = (struct memheads*)&zone->heapData;
- while (memhead < (struct memheads*)zone->bkLim)
- {
- tagbyte = memhead->physsize >> 24;
- tagbyte >>= 6;
- switch (tagbyte)
- {
- case 0 : tfree++; break;
- case 1 : tnonrel++; break;
- case 2 : trel++; break;
- }
- tblocks++;
- memhead = (struct memheads*)((char*)memhead + (memhead->physsize & 0x00FFFFFF));
- }
- printw("\n blocks %d free %d relocatable %d non-relocatable %d ",
- tblocks, tfree, trel, tnonrel);
- }
-
- /* dofile
- * handles file menu
- */
- dofile(item)
- short item;
- {
- char *title1; /* first title for window */
- Rect boundsRect;
-
- switch (item)
- {
- case iNew : /* open the window */
- title1 = "ABC Window";
- SetRect(&boundsRect,50,50,400,200);
- theWindow = NewWindow(&windowRec, &boundsRect,
- CtoPstr(title1),True,documentProc,
- (WindowPtr) -1, True, 0);
- DrawGrowIcon(theWindow);
- PtoCstr(title1);
- DisableItem(menuFile,1);
- EnableItem(menuFile,2);
- break;
-
- case iClose : /* close the window */
- CloseWindow(theWindow);
- theWindow = Nil;
- DisableItem(menuFile,2);
- EnableItem(menuFile,1);
- break;
-
- case iQuit : /* Quit */
- ExitToShell();
- break;
- }
- }
-
-
-
-